Виджеты. Column Row Container
➡️Скачать презентацию. Flutter Column Row Container
➡️Скачать шпаргалку Виджет Row Column
➡️Ссылка на репозиторий с кодом этого урока
Все свойства и методы для Row и Column
Размер контейнера
mainAxisSize: MainAxisSize.max - Строка или столбец занимают максимально возможное пространство на главной оси. Значение по умолчанию
mainAxisSize: MainAxisSize.min - Строка или столбец ужмутся до своих children
По умолчанию элементы находятся в самом начале главной оси и, строка или столбец, занимает максимальную ширину. Чтобы ширина ужалась до содержимого указываем MainAxisSize.min
child: Row(
mainAxisSize: MainAxisSize.min, // ужать ширину строки до содержимого
children: [
Box(),
Box(),
Box(),
],
),

Если указано значение MainAxisSize.max, можно применить свойства mainAxisAlignment и crossAxisAlignment
Выравнивание по главной оси mainAxisAlignment
Указывается так -
mainAxisAlignment: MainAxisAlignment.start
.start - элементы в начале главной оси.
.end - элементы в конце главной оси.
.center - элементы по центру главной оси.
.spaceBetween - между элементами равное пространство.
.spaceAround - между элементами равное пространство, а также добавляется половина этого пространства до и после первого и последнего элемента.
.spaceEvenly - между элементами равное пространство, включая пространство до и после первого и последнего элемента.
Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.start, // в начале главной оси
// mainAxisAlignment: MainAxisAlignment.center, // по центру главной оси
// mainAxisAlignment: MainAxisAlignment.end, // в конце главной оси
children: [
RollCard(),
RollCard(),
RollCard(),
],
),
.png)
Column(
mainAxisSize: MainAxisSize.max,
// mainAxisAlignment: MainAxisAlignment.start,
// mainAxisAlignment: MainAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.end,
children: [
RollCard(),
RollCard(),
RollCard(),
],
),
.png)
Расстояние между элементами
Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
// mainAxisAlignment: MainAxisAlignment.spaceAround,
// mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
RollCard(),
RollCard(),
RollCard(),
],
),
.png)
Выравнивание по поперечной оси crossAxisAlignment
Указывается так - crossAxisAlignment: CrossAxisAlignment.stretch
.stretch - элементы растягиваются на всю ширину поперечной оси.
.start - элементы выравниваются в начале поперечной оси.
.end - элементы выравниваются в конце поперечной оси.
.center - элементы выравниваются по центру поперечной оси.
.baseline - базовые линии элементов выравниваются по одной линии.
Чтобы продемонстрировать работу выравнивания по поперечной оси, сделаем размер среднего виджета немного больше. Для этого добавим в виджет RolCard параметр height
class HomeWidget extends StatelessWidget {
const HomeWidget({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(centerTitle: true, title: const Text("Container")),
body: Center(
child: Container(
decoration: BoxDecoration(color: Color.fromARGB(139, 33, 149, 246)),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
RollCard(),
RollCard(height: 250), // 👉 Виджет будет выше
RollCard(),
],
),
),
),
);
}
}
/// Виджет Карточка товара
/// Товар Роллы содержит картинку, описание и кнопку купить
class RollCard extends StatelessWidget {
final double height; // 👉 Виджет принимает знчение высоты
const RollCard({super.key, this.height = 200});
@override
Widget build(BuildContext context) {
return Container(
height: height, // 👉 Используем высоту через параметр
padding: const EdgeInsets.all(8),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: Colors.black),
borderRadius: BorderRadius.circular(16),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset("assets/images/roll.png", width: 100),
SizedBox(height: 10),
Text("Вкусные Роллы", style: TextStyle(fontSize: 12)),
ElevatedButton(onPressed: () {}, child: Text("Купить")),
],
),
);
}
}
.png)
Выравнивание по поперечной оси
Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center, // по центру у поперечной оси
// crossAxisAlignment: CrossAxisAlignment.start, // в начале поперечной оси
// crossAxisAlignment: CrossAxisAlignment.end, // в конце у поперечной оси
// crossAxisAlignment: CrossAxisAlignment.stretch, // растянуть элементы
children: [
RollCard(),
RollCard(height: 250),
RollCard(),
],
),
.png)
При использовании CrossAxisAlignment.stretch элементы расстягиваются в данном случае на всю высоту экрана. Нам бы хотелось, чтобы элементы расстянулись на высоту равную самому высокому элементу. В данной ситуации можно ограничить размер родительского виджета у строки, например обернуть строку в Container() или в SizedBox() и указать точные ограничения высоты.
class HomeWidget extends StatelessWidget {
const HomeWidget({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(centerTitle: true, title: const Text("Container")),
body: Center(
child: Container(
height: 250, // 👉 Ограничиваем размер
decoration: BoxDecoration(color: Color.fromARGB(139, 33, 149, 246)),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
// crossAxisAlignment: CrossAxisAlignment.center,
// crossAxisAlignment: CrossAxisAlignment.start,
// crossAxisAlignment: CrossAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.stretch, // 👉 растянуть элементы
children: [
RollCard(),
RollCard(height: 250),
RollCard(),
],
),
),
),
);
}
}
